%%定序算法  
clc,
clear
load  Q2.mat;
% Chic_data = xlsread('chucunshuju_1.xlsx','A1:B49');  %49个样本
Chic_data = Q2{1 ,4} ;  % 读取第一组数据，测试
N = size(Chic_data , 1);  %数据维度
M = 50; % 种群数量
MM =50; % 最大迭代次数
L1 = [];
L2 = [];
%% 生成初始种群
for i = 1 : M
    PartSeqence=randperm(N);
    H(i , :) = PartSeqence;  %第i个种群
    
    for j = 1 : N
        PS(j , :) = Chic_data(PartSeqence(j) , :);  
    end
    DY_data = PS;  %第i个种群对应的零件序列
    [ P_fit , PLOT{i , 1} ,PartS{i ,1} ] = dingwei(PartSeqence ,DY_data);  %第i个种群的适应度（利用率），  根据定位算法
    
    H_fit(i , :) = P_fit;  %初始化种群的适应度
end
HH_fit = max(H_fit);  %初始化种群 对应的 最大适应度
a = find(H_fit == HH_fit); %最大适应度对应 的位置
b = a(1 , 1);   %最大适应度对应 的位置
PartS_1 = PartS{b ,1};  % 头狼找到后，提取出对应的排样图序列。
wolf(1 , :) = H(b , :); %头狼
PLOT_1 = PLOT{ b,1 }; % 头狼对应，的画图数据.
H(b,:) = [];
wolf_1 = H; %其他狼

for i5 = 1 : MM
    %% 游走
    wolf_2 = [];
    for i1 = 1 : size(wolf_1 , 1)
        c = randi([1 N-4]);  %随机游走编码序列 的起点位置。
        d = 5;  % 设定游走序列的长度
        c1 = c + d - 1 ;
        if c > (1 + N -4)/2
            wolf_2( i1 , :) = [wolf_1(i1 , c : c1) , wolf_1(i1 ,  1:(c-1)) , wolf_1(i1 , (c1+1) : N) ];
        else
            wolf_2( i1 , :) = [wolf_1(i1 ,  1:(c-1)) , wolf_1(i1 , (c1+1) : N) , wolf_1(i1 , c : c1)];
        end
        % wolf_2( i1 , :) = [wolf_1(i1 ,  1:(c-1)) , wolf_1(i1 , (c1+1) : N) , wolf_1(i1 , c : c1)]; %游走后       
        PartSeqence = wolf_2( i1 , :);
        for j = 1 : N
            PS_1(j , :) = Chic_data(PartSeqence(j) , :);%（游走之后零件序列对应的零件尺寸）
        end  
        DY_data = PS_1;  % 零件序列对应的 零件数据
        [ Y_fit(i1 , :) ] = dingwei(PartSeqence , DY_data);  %游走后利用率（适应度值）
    end
    wolf_2 = [wolf_2 ; wolf];  %包括头狼的 种群
    Y_fit = [Y_fit ; HH_fit ];  %包括头狼的种群 的适应度
    wolf = [];
    
    HH_fit = max(Y_fit);  %游走后种群 对应的 最大适应度头狼 对应的适应度值
    a = find(Y_fit == HH_fit );
    b = a(1 , 1);
    wolf(1 , :) = wolf_2(b , :);  %头狼  更新头狼
    wolf_2(b,:) = [];
    wolf_1 = wolf_2;  %其他狼
    Y_fit(b,:) = [];   %其他狼对应的适应度值
    %% 奔袭，
    for i3 = 1 : size(wolf_1 , 1)
        G = wolf_1(i3 , :);
        %判断 灰狼 与 头狼之间不同编码位，对应的位置，
        for i7 = 1 : size(G ,2)
            if G(1, i7) ~= wolf(1 , i7)
                L1 =[L1 ,i7];%（？）
                L2 = [L2 , wolf(1 , i7) ];
                s1 = 3; % 选择s1个编码位
            end
        end
        for i4 = 1 : s1   
            e1 = L1 (1 , i4); % G 中要 更改的位置e1
            e2 = L2 (1 , e1); %将L2中位置e1的数e2提取，准备放入wolf_1中
            e3 = find( G == e2); %找到G中e2对应的位置 e3
            e4 = G(1 , e1); %确定wolf_1中位置e3，应放置的数e4
            %交换e2 e4
            G(1 ,e3) = e4;
            G(1 ,e1) = e2;
        end
        PartSeqence = wolf_1( i3 , :);
        for j = 1 : N
            PS_2(j , :) = Chic_data(PartSeqence(j) , :);
        end
        DY_data = PS_2;  % 零件序列 对应的 零件数据
        [Z_fit(i3 , :) , PLOT{i3 ,1} , PartS{i3 ,1} ] = dingwei(PartSeqence , DY_data); %第i个（其他狼）围攻后的适应度 对应其他狼 wolf_1
        %  原本的头狼 wolf 对应的是适应度值 HH_fit
    end
    
    wolf_2 = [wolf_1 ; wolf];  %包括头狼的 种群
    Z_fit = [Z_fit ; HH_fit ];  %包括头狼的种群的适应度
    wolf = [];
    
    HH_fit = max(Z_fit);  %围攻后种群 对应的 最大适应度
    a = find(Z_fit == HH_fit );   %最大适应度值 对应的 第i个零件序列
    b = a(1 , 1);
    wolf(1 , :) = wolf_2(b , :);  %头狼  更新头狼
    wolf_2(b,:) = [];
    wolf_1 = wolf_2;  %其他狼
    Z_fit(b,:) = [];
    
    PartSeqence = wolf;
    for j = 1 : N
        PS_3(j , :) = Chic_data(PartSeqence(j) , :);
    end
    DY_data = PS_3;  % 零件序列 对应的 零件数据
    
    [ fit,PLOT_1 , PartS_1 ] = dingwei(PartSeqence , DY_data);
            FIT(i5 , 1) = HH_fit;
end

% 绘图
  % s = 0; % 初始化画布
for i6 = 1 : size(PLOT_1 ,1)   %%还需要重新更新画布
    F = PLOT_1{i6,1};
    if F(1,1) == 0 && F(1,2) == 0  %判断是否更新画布
        
      % s = s +1;
        
      figure %figure(s); %更新画布
        axis square   %(纵坐标，横坐标每个刻度范围不一样)
        set(gca,'xLim',[0,2000]); %板材纵向排列
        set(gca,'yLim',[0,10000]);        
%         set(gca,'xlim',[0,2440]); %板材纵向排列
%         set(gca,'ylim',[0,1220]);        
        rectangle('Position',F);%（具有尖角的矩阵）
        title('排样图');
    else
        rectangle('Position',F);
    end
    if F(1,4)~=0
    text(F(1,1)+F(1,3)/2,F(1,2)+F(1,4)/2,num2str(PartS_1(1 , i6))); % 标记零件序号
    end
end